元件間的資料傳遞可以說是Vue
的大重點之一。
在第8天和第9天介紹了由外層父元件傳給子元件,
而今天要來說說如何把子元件由內到外進行「事件的單向傳遞」傳給父元件的Vue instance。
來!先跟我一起記一下口訣~
props
emit
以下是今天在Rails app練習時做出的頁面:
當我按下子元件的按我,送出Emit
按鈕的時候,會將this.$emit('news');
送出去。
$emit('自訂事件名稱')
在UI使用Vue元件時,透過@click='自訂事件名稱'
的事件綁定,
按鈕被按下後,會emit
傳遞自訂的news
事件給父層元件。
News.vue
<template>
<div class="news">
<h1>本日重點:{{ message }}</h1>
<button class="news-btn" @click="clickNews">按我,送出Emit</button>
</div>
</template>
<script>
export default {
data: function () {
return {
message: "由內層到外層元件的單向資料流:在子元件利用$emit('自訂事件名稱')送出事件給父元件"
}
},
methods: {
clickNews(){
this.$emit('news');
}
}
}
</script>
我在News
元件上使用<News v-on:news="rootMethod"></News>
語法,讓父層接收了子元件傳出的事件方法news
home.html.erb
<div id="content">
<div class="main-title">Vue.js x Rails第12屆鐵人賽專案:{{ day }}</div>
<div class="main-body">本日主題:{{ topic }}</div>
<News v-on:news="rootMethod"></News>
<Foot></Foot>
</div>
rootMethod()
方法在本日的鐵人賽是透過console.log
印出子元件送出事件,傳給父元件
這段話,
作為成功傳給Root
元件的證據~
home.js
import TurbolinksAdapter from 'vue-turbolinks'
import Vue from 'vue/dist/vue.esm'
import News from "../components/news"
import Foot from "../components/foot"
Vue.use(TurbolinksAdapter)
document.addEventListener('turbolinks:load', () => {
let el = document.querySelector("#content");
if (el){
new Vue({
el,
data: {
day: "第 10 天",
topic: "元件的溝通 - emit",
},
methods: {
rootMethod(){
console.log("子元件送出事件,傳給父元件")
}
},
components: { News, Foot }
})
}
})
emit完成圖
到第十天了耶~1/3了,可喜可賀!
為了之後進行Rails專案得以更順利,花了不少時間與篇幅在理解及研究元件間的的data-flow。
明天來試試用$emit
的特性,做個簡單的to-do list吧!
也許以後再回來看這個系列,會懷念2020的秋天鐵人賽,每天晚上都與Vue.js
搏鬥的日子:)
Ref: